package cn.lcsjsxy.yxc.objectoriented.多态性;

/**
 * 面向对象特性之三（com.yang_xc.objectoriented.多态性）
 *
 * 1.理解多态性：可以理解为一个事务的多种形态。
 * 2.何为多态性：
 *           子类对象的多态性：父类的引用指向子类的对象（或子类的对象赋给父类的引用）
 * 3.多态的使用：虚拟的方法调用
 *   有了对象的多态性以后，我们再编译期，只能调用父类中声明的方法，但在运行期，我们实际执行的是子类重写父类的方法。
 *   总结：编译看左边，运行看右边
 * 4.多态性的使用前提：1.类的继承关系
 *                  2.方法的重写
 * 5.对象的多态性，只适用于方法，不适用与属性（编译和运行都看左边）
 */
public class PersonTest {

    public static void main(String[] args) {
        Person P1=new Person("吗喽",12);
        P1.eat();
        Man man=new Man("man",12,true);
        man.eat();
        man.age=25;
        man.earnMoney();

        //*******************************************************
        //子类对象的多态性：父类的引用指向子类的对象
        Person P2=new Man("man",12,true);
//        com.yang_xc.miscellaneous.Person p3=new Woman();
        //多态的使用：当调用子父类同名同参数的方法时，史记执行的是子类重写父类的方法——————虚拟的方法调用
        P2.eat();  //此处调用的是子类中重写的方法
        P2.walk();  //同上
        System.out.println(P2.id);  //此处打印的是父类中的值
    }
}
